import nodemailder from 'nodemailer'
import yaml from 'js-yaml'
import fs from 'node:fs'
import http from 'node:http'
import url from 'node:url'

import express from 'express'

const router = express.Router() //路由模块
router.post('/send', (req, res) => {
  const mailConfig = yaml.load(fs.readFileSync('./public/yaml/config.yaml', 'utf8'))
  console.log('mailConfig', mailConfig)
  const transPort = nodemailder.createTransport({
    service: 'qq',
    port: 587,
    host: 'smtp.qq.com',
    secure: true,
    auth: {
      pass: mailConfig.pass,
      user: mailConfig.user,
    },
  })
  console.log('req.body', req.body)
  const body = req.body
  transPort.sendMail({
    to: body.to,
    from: mailConfig.user,
    subject: body.subject,
    text: body.text,
  })
  res.setHeader('Content-Type', 'application/json') // 设置响应头的 Content-Type 为 'application/json'
  res.json({ val: 'ok' })
})

/* 
 Node.js HTTP 服务器中，你需要监听 'data' 和 'end' 事件来分别处理接收到的数据块和结束事件。
 但在 Express.js 中，由于使用了诸如 body-parser 或 express-json 这样的中间件，这些事件处理被抽象掉了。

 它主要用于低级网络编程，例如当你需要直接与 TCP 套接字交互，或者想要更细粒度的控制时。
 res.end() 是这个模块中用于发送响应的方法。它只是简单地结束响应并发送任何之前写入响应的主体。
 res.json({ val: 'ok' }) 是 Express 中用于发送 JSON 响应的方法。它自动设置正确的 Content-Type，并序列化给定的对象为 JSON 格式

 application/json：这种类型是目前最常用的，用于表示 JSON 数据格式。当使用这种类型时，发送的数据是序列化后的 JSON 字符串。
 application/x-www-form-urlencoded：这种类型用于表示表单数据，其中数据被编码为键值对。发送的数据是键值对的形式。
 multipart/form-data：这种类型用于发送表单数据，其中包含二进制数据或文件。发送的数据包含一个或多个部分，每个部分都有自己的 Content-Type 和标识符。
 text/xml：这种类型用于表示 XML 数据格式。发送的数据是 XML 格式的字符串。
 */
router.post('/send/8848', (req, res) => {
  const mailConfig = yaml.load(fs.readFileSync('./mail.yaml', 'utf8'))
  const transPort = nodemailder.createTransport({
    service: 'qq',
    port: 587,
    host: 'smtp.qq.com',
    secure: true,
    auth: {
      pass: mailConfig.pass,
      user: mailConfig.user,
    },
  })

  http
    .createServer((req, res) => {
      const { pathname } = url.parse(req.url)
      if (req.method === 'POST' && pathname == '/send/mail') {
        let mailInfo = ''
        req.on('data', chunk => {
          mailInfo += chunk.toString()
        })
        req.on('end', () => {
          const body = JSON.parse(mailInfo)
          transPort.sendMail({
            to: body.to,
            from: mailConfig.user,
            subject: body.subject,
            text: body.text,
          })
          res.end('ok')
        })
      }
    })
    .listen(8848)

  res.json({ val: 'ok' })
})

export default router
